/* Universidad del Valle de Guatemala
 * Mariana Castillo, 12374
 * Julio Maldonado, 12377
 * Jose Pablo Rodriguez, 12364
 * Seccion 30, Algoritmos y Estructura de Datos
 * Fecha:31/08/13
 * Se ejecuta el programa y se elige la implementacion a utilizar*
 */

package hoja6;


import java.util.Scanner;
import java.util.*;

public class Hoja6 {

    public static void main(String[] args) {
        //Variables
        Factory factory = new Factory(); 
        Scanner scan = new Scanner (System.in);
        String op, implem, nombre, conjunto;
        int z=0;
        int z1=0;
        //SE crean los tres conjuntos
        Set conjunto1=null;
        Set conjunto2=null;
        Set conjunto3=null;
        Set conjunto4=null;
        System.out.println("CONJUNTOS");
        //Se decide que opcion utilizar atraves del patron factory
        while(z==0){
            System.out.print("Qué implementacion de SET desea utilizar en este programa? \n \ta)HashSet  \n \tb)LinkedHashSet  \n \tc)TreeSet \n\t >>> ");
            implem = scan.nextLine();
            //Se crea Hashset
            if (implem.equalsIgnoreCase("a")) {
                z=1;
                System.out.println("HASHSET");
                conjunto1 = factory.getImplementacion("HS");
                conjunto2 = factory.getImplementacion("HS");
                conjunto3 = factory.getImplementacion("HS");
                conjunto4 = factory.getImplementacion("HS");
                
            }     
            //Se crea Linked HashSet
            else if(implem.equalsIgnoreCase("b")){
                z=1;
                System.out.println("LINKED HASHSET");
                conjunto1 = factory.getImplementacion("LH");
                conjunto2 = factory.getImplementacion("LH");
                conjunto3 = factory.getImplementacion("LH");  
                conjunto4 = factory.getImplementacion("LH");
            }
            //Se crea Treeset
            else if(implem.equalsIgnoreCase("c")){
                z=1;
                System.out.println("TREESET");
                conjunto1 = factory.getImplementacion("l");
                conjunto2 = factory.getImplementacion("l");
                conjunto3 = factory.getImplementacion("l");  
                conjunto4 = factory.getImplementacion("l");
            }
            else{
                System.out.println("ERROR: Ingrese una opcion valida\n");
            } 
        System.out.println("CONJUNTOS");
        while(z==0){
            System.out.print("Qué implementacion de SET desea utilizar en este programa? \n \ta)HashSet  \n \tb)LinkedHashSet  \n \tc)TreeSet \n\t >>> ");
            implem = scan.nextLine();

            if (implem.equalsIgnoreCase("a")) {
                z=1;
                System.out.println("HASHSET");
                conjunto1 = factory.getImplementacion("HS");
                conjunto2 = factory.getImplementacion("HS");
                conjunto3 = factory.getImplementacion("HS");
                conjunto4 = factory.getImplementacion("HS");
                
            }      
            else if(implem.equalsIgnoreCase("b")){
                z=1;
                System.out.println("LINKED HASHSET");
                conjunto1 = factory.getImplementacion("LH");
                conjunto2 = factory.getImplementacion("LH");
                conjunto3 = factory.getImplementacion("LH");  
                conjunto4 = factory.getImplementacion("LH");
            }
            else if(implem.equalsIgnoreCase("c")){
                z=1;
                System.out.println("TREESET");
                conjunto1 = factory.getImplementacion("l");
                conjunto2 = factory.getImplementacion("l");
                conjunto3 = factory.getImplementacion("l");  
                conjunto4 = factory.getImplementacion("l");
            }
            else{
                System.out.println("ERROR: Ingrese una opcion valida\n");
            } 
        }
        //Luego se ingresan nombres y se decide a que conjunto agregarlos
        while(z1==0){
                System.out.println("\nMENU \n 1. Ingresar Personas \n 2. Ver resultados \n 3. Fin\n");
                op= scan.next();
                if(op.equals("1")){
                    System.out.println("Ingrese el nombre de la persona");
                    nombre= scan.next();
                    System.out.println("Indique que ambiente ha desarrollado:");
                    System.out.println("\t1. Desarrolladores Java");
                    System.out.println("\t2. Desarrolladores Web ");
                    System.out.println("\t3. Desarrolladores Celulares");
                    System.out.println("\t4. Desarrolladores Java-Web");
                    System.out.println("\t5. Desarrolladores Java-Celulares");
                    System.out.println("\t6. Desarrolladores Web-Celulares");
                    System.out.println("\t7. Desarrolladores Java-Web-Celular");
                    conjunto=scan.next();
                    //Se revisan la opciones para agregar al conjuntos
                    if(conjunto.equals("1")){
                        conjunto1.add(nombre);
                        System.out.println("Agregado a Conjunto Java");
                    }
                    else if(conjunto.equalsIgnoreCase("2")){
                        conjunto2.add(nombre);
                        System.out.println("Agregado a Conjunto Web");
                    }
                    else if(conjunto.equalsIgnoreCase("3")){
                        conjunto3.add(nombre);
                        System.out.println("Agregado a Conjunto Celular");
                    }
                    else if(conjunto.equalsIgnoreCase("4")){
                        conjunto1.add(nombre);
                        conjunto2.add(nombre);
                        System.out.println("Agregado a Conjunto Java y Conjunto Web");
                    }
                    else if(conjunto.equalsIgnoreCase("5")){
                        conjunto1.add(nombre);
                        conjunto3.add(nombre);
                        System.out.println("Agregado a Conjunto Java y Conjunto Celular");
                    }
                    else if(conjunto.equalsIgnoreCase("6")){
                        conjunto2.add(nombre);
                        conjunto3.add(nombre);
                        System.out.println("Agregado a Conjunto Web y Conjunto Celular");
                    }
                    else if(conjunto.equalsIgnoreCase("7")){
                        conjunto1.add(nombre);
                        conjunto2.add(nombre);
                        conjunto3.add(nombre);
                        conjunto4.add(nombre);
                        System.out.println("Agregado a Conjunto Java, Conjunto Web y Conjunto Celular");
                    }
                    else{
                        System.out.println("Opcion Invalida");
                    }
                }
                //Se muestran los resultado de los conjuntos 
                else if(op.equals("2")){
                    //Se convierten a Array los conjuntos
                    Object[] conj1= conjunto1.toArray();
                    Object[] conj2= conjunto2.toArray();
                    Object[] conj3= conjunto3.toArray();
                    ArrayList inter123= new ArrayList();
                    ArrayList inter23= new ArrayList();
                    ArrayList jsinweb= new ArrayList();
                    //Se revisan las intersecciones de los conjuntos
                    //Se revisan los elementos del conjunto 2 que tambien esten en 3
                    try{
                    for(int i=0; i< conjunto2.size();i++){
                        if(conjunto3.contains(conj2[i])==true){
                            inter23.add(conj3[i]);
                        }
                    }
                    //Se revisa que los elementos del conjunto2 y 3 tambien esten en 1, si es cierto se agregan al arraylist
                    for(int i=0; i<inter23.size();i++){
                        if(conjunto1.contains(inter23.get(i))==true){
                            inter123.add(conj1[i]);
                        }
                    }
                    //Se revisa las personas que pertenezcan al conjunto java pero no tengan experiencia web
                    for(int i=0; i<conjunto1.size();i++){
                        if(conjunto2.contains(conj1[i])==false){
                            jsinweb.add(conj1[i]);
                        }
                    }
                    }catch (Exception i){}
                    
                    System.out.println("\n1. Desarrolladores con Experiencia Java, Web y Celulares");
                        System.out.println(conjunto4);
                    System.out.println("\n2. Desarrolladores con Experiencia Java sin Experiencia Web");
                    if(jsinweb.size()==0){
                        System.out.println("Ninguno");
                    }else{
                        for(int i=0; i<jsinweb.size();i++){
                            System.out.println(jsinweb.get(i));
                        }
                    }
                        
                    System.out.println("\n3. Desarrolladores con Experiencia Web y Celulares");
                    for(int i=0; i<inter23.size();i++){
                        System.out.println(inter23.get(i));
                        }
                    System.out.println("\n4. Desarrolladores con Experiencia Web o en Celulares");
                    System.out.println(conjunto2);
                    System.out.println(conjunto3);
                    //Se revisa que si el conjunto java contiene todos los elementos de web
                    System.out.println("\n5. Java es subconjunto de Web");
                    if(conjunto2.containsAll(conjunto1)==true){
                        System.out.println("JAVA SI ES SUBCONJUNTO DE WEB");
                    }
                    else{
                        System.out.println("JAVA NO ES SUBCONJUNTO DE WEB");
                    }
                    
                    //Se vericia el conjunto con mayor cantidad de elementos y se muestra
                    System.out.println("\n6. Conjunto con mas desarrollares");
                    if((conjunto1.size()>conjunto2.size())&&(conjunto1.size()>conjunto3.size())){
                        System.out.println("El mayor es Desarrolladores Java");
                        System.out.println(conjunto1);
                    }
                    else if((conjunto2.size()>conjunto1.size())&&(conjunto2.size()>conjunto3.size())){
                        System.out.println("El mayor es Desarrolladores Web");
                        System.out.println(conjunto2);
                    }
                    else{
                        System.out.println("El mayor es Desarrolladores Celulares");
                        System.out.println(conjunto3);
                    }
                    //Se muestra el conjunto con mayor cantidad ordenado ascendentemente
                    System.out.println("\n7. Mayor Ordenado Ascendente");
                     if((conjunto1.size()>conjunto2.size())&&(conjunto1.size()>conjunto3.size())){
                        System.out.println("Desarrolladores Java");
                        Arrays.sort(conj1);
                        for (Object str : conj1) {
                            System.out.println(str);
                        }
                    }
                    else if((conjunto2.size()>conjunto1.size())&&(conjunto2.size()>conjunto3.size())){
                        System.out.println("Desarrolladores Web");
                        Arrays.sort(conj2);
                        for (Object str : conj2) {
                            System.out.println(str);
                        }
                    }
                    else{
                        System.out.println("Desarrolladores Celulares");
                        Arrays.sort(conj3);
                        for (Object str : conj3) {
                            System.out.println(str);
                        }
                    }

                }
                //Se termina el programa
                else if(op.equals("3")){
                    z1=1;
                    z=0;
                }
                //Programacion defensiva
                else{
                    System.out.println("Opcion invalida");
                }
            }

        
        }
    } 
}
